package com.wgy.day20.内部类.局部内部类.匿名内部类;

/*
如果接口的实现类(或者父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,
而改为使用匿名内部类

匿名内部类的定义格式:
接口名称 对象名称 = new 接口名称(){
//覆盖重写所有的抽象方法
};

对格式" new 接口名称(){...} " 进行解析:
1.new代表创建对象的动作
2.接口名称就是匿名对象内部类需要实现哪个接口
3.{...}这才是匿名内部类的内容

注意事项:

1.匿名内部类,在创建对象的时候,只能使用唯一的一次.
如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类了.
2.匿名对象,在调用方法的时候,只能调用唯一一次.
如果希望同一个对象,调用多次方法,那么必须给对象起个名字.
3.匿名内部类是省略了实现类/子类,但是匿名对象是省略了对象名称
强调: 匿名对象和匿名内部类不是一回事!!!



*/
public class Demo01Main {
    public static void main(String[] args) {
        //    MyInterfaceImpl impl=new MyInterfaceImpl //普通写法
        //      MyInterface obj=new MyInterfaceImpl();   //多态写法
        //       obj.method();

        //      MyInterface obj=new MyInterface();  //错误写法!接口无法直接new对象的

        //使用匿名内部类 ,但不是匿名对象,对象的名称就是obj
        MyInterface obj = new MyInterface() {
            @Override
            public void method() {
                System.out.println("匿名内部类实现了方法!111");
            }

            @Override
            public void method2() {
                System.out.println("匿名内部类实现了方法!222");
            }
        };
        obj.method();
        obj.method2();
        System.out.println("============");

        //使用了匿名内部类,而且省略了对象名称,也是匿名对象

        new MyInterface() {
            @Override
            public void method() {
                System.out.println("匿名内部类实现了方法!111-A");
            }

            @Override
            public void method2() {
                System.out.println("匿名内部类实现了方法!222-A");
            }
        }.method();
      //还想要调用方法2  因为匿名对象无法调用第二次方法,所有需要在创建一个匿名内部类的匿名对象
        new MyInterface (){

            @Override
            public void method() {
                System.out.println("匿名内部类实现了方法!111-A");
            }

            @Override
            public void method2() {
                System.out.println("匿名内部类实现了方法!222-A");
            }
        }.method2();


    }
}
